PhilipsPhilips I2C-busI2C-bus


Wstęp

Szyna I2C była tematem mojej pracy dyplomowej w warszawskim Technikum Elektronicznym zwanym potocznie Zajączkiem, którego jestem absolwentem. Ponieważ w zasadzie nie ma polskiej literatury na temat tej szyny, postanowiłem udostępnić część opisu mojej pracy dyplomowej dotyczącą I2C na mojej stronie WWW.

Szyna I2C (ang. Inter Integrated Circuit bus), choć stosunkowo mało znana, jest bardzo często stosowana w elektronice motoryzacyjnej i w sprzęcie audio-video. Ostatnimi czasy pewne odmiany szyny I2C (ACCESS.bus, Universal Serial Bus) zaczynają wkraczać do komputerów PC i zapewne niedługo, dzięki poparciu takich firm jak Intel, Microsoft, Philips, stanie się ona bardzo popularna. Dlatego warto zaznajomić się z tą bardzo ciekawą formą szeregowej szyny danych.


Spis treści

Opis szyny I2C

Charakterystyka ogólna

Transfer - na poziomie bitów

START i STOP

Transfer - na poziomie bajtów

Potwierdzenie

Arbitraż i synchronizacja

Adresowanie 7-bitowe

Rozszerzenia specyfikacji szyny I2C


Opis szyny I2C

Komputerowe systemy sterowania posiadają zwykle następujące cechy:

ˇ System składa się z co najmniej jednego mikrokontrolera i różnych urządzeń peryferyjnych, takich jak na przykład pamięci i układy wejścia/wyjścia.

ˇ Koszt dołączania różnych urządzeń musi być jak najmniejszy.

ˇ System taki spełnia zwykle zadania kontrolne w związku z czym szybki transfer danych nie jest konieczny.

ˇ Ogólna wydajność całego systemu zależy od wybranych urządzeń i szyny ich łączącej.

Aby spełnić te założenia warto zastosować strukturę opartą na szynie szeregowej, łączącej w sobie wszystkie trzy szyny: adresową, danych i sterującą. Co prawda szyna szeregowa nie dorównuje szybkością przesyłu szynie równoległej, to jednak wymaga mniejszej ilości połączeń i mniejszej ilości nóżek w układach scalonych. Zresztą szyna to nie tylko sposób łączenia układów, szyna ucieleśnia wszystkie formaty i protokoły komunikacji w obrębie systemu.

Układy komunikujące się ze sobą za pomocą szyny szeregowej muszą posługiwać się jakąś formą protokołu, która wyeliminuje możliwość kolizji sygnałów, utraty danych i zablokowania przepływu informacji. Ponadto urządzenia szybkie muszą mieć możliwość komunikowania się z układami wolniejszymi. System nie może być zależny od podłączonych do niego układów, ponieważ uniemożliwiłoby to wszelkie ewentualne modyfikacje i unowocześnienia. Poza tym jeżeli do szyny podłączone są różne układy taktowane zegarami o różnych częstotliwościach to musi być zdefiniowane źródło sygnału zegarowego szyny. Wszystkie te kryteria zostaną spełnione jeśli zastosujemy szynę I2C opracowaną i opatentowaną przez firmę Philips.

Wróć do początku


Charakterystyka ogólna

Na szynę I2C składają się tylko dwie linie: linia danych (oznaczana jako SDA, ang. serial data) i linia zegara taktującego transmisję (oznaczana jako SCL, ang. serial clock). Tymi dwiema liniami przesyłane są wszystkie informacje: dane, adresy i sygnały sterujące. Obie linie szyny I2C - SDA i SCL - są liniami dwukierunkowymi i przez rezystor podciągający podłączone są do dodatniego napięcia zasilającego. Gdy na szynie nie odbywa się żadna transmisja to na obu liniach jest poziom wysoki. Obwody wyjściowe podłączonych układów muszą być typu otwarty-dren lub otwarty-kolektor, ze względu na konieczność realizacji funkcji galwaniczne-AND. Dane na szynie I2C mogą być przesyłane z prędkością do 100kb/s w trybie standardowym (ang. Standard-mode) lub do 400kb/s w trybie szybkim (ang. Fast-mode). Liczba układów podłączonych do szyny jest zależna od maksymalnej pojemności szyny wynoszącej 400pF.

Każdy układ podłączony do szyny I2C rozpoznawany jest przez swój adres i może pracować zarówno jako nadajnik, jak i odbiornik. Oczywiście sterownik wyświetlacza LCD jest tylko odbiornikiem, ale np. pamięć może być jednym i drugim. Dodatkowo podczas transmisji podłączone układy dzielą się na master i slave. Master jest to układ inicjujący transmisję i generujący sygnał zegarowy umożliwiający tą transmisję. W tym momencie każdy zaadresowany układ jest układem slave.

Transmisja na szynie I2C jest transmisją start-stopową, tzn. każdy transfer rozpoczyna się od bitu START, po którym przesyłane są informacje (w przeciwieństwie jednak do interfejsu RS-232C ich ilość nie jest ograniczona), i kończy się bitem STOP.

Szyna I2C jest szyną typu multi-master. To znaczy, że może być podłączonych wiele układów mogących kontrolować transmisję. Zwykle układami master są mikrokontrolery. Rozpatrzmy taką sytuację, gdy podłączone są dwa mikrokontrolery. Może to wyglądać np. tak:

1. Przypuśćmy, że mikrokontroler A chce wysłać informację do mikrokontrolera B:

ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)

ˇ mikrokontroler A (nadajnik-master) wysyła dane do mikrokontrolera B (odbiornik-slave)

ˇ mikrokontroler A kończy transmisję.

2. Jeśli mikrokontroler A chce odebrać informacje od mikrokontrolera B:

ˇ mikrokontroler A (master) adresuje mikrokontroler B (slave)

ˇ mikrokontroler A (odbiornik-master) odbiera dane od mikrokontrolera B (nadajnik-slave)

ˇ mikrokontroler A kończy transmisję.

W obu przypadkach master (mikrokontroler A) generuje przebieg zegarowy oraz kończy transmisję.

Możliwość podłączenia kilku mikrokontrolerów do szyny I2C powoduje, że może zaistnieć sytuacja, w której kilka układów master chce rozpocząć transmisję w tej samej chwili. Aby uniknąć zgubienia danych stosowana jest specjalna procedura, pozwalająca wyłonić, który master będzie nadawał. Procedura ta oparta jest na funkcji galwaniczne-AND, która to wynika ze sposobu podłączenia wszystkich układów do szyny I2C.

Jeżeli dwa lub więcej układów master rozpoczyna transmisję, to układ, który pierwszy wygeneruje bit o poziomie logicznym '1', gdy inne układy generują '0', traci arbitraż. Sygnał zegarowy na linii SCL podczas procedury arbitracyjnej jest funkcją galwaniczne-AND sygnałów zegarowych generowanych przez układy master, chcące zainicjować transmisję.

Generowanie sygnału zegarowego na szynie I2C jest zawsze zadaniem układu typu master. Każdy master generuje swój własny sygnał zegarowy podczas transmisji danych. Sygnał zegarowy z układu master może być zmieniony tylko, wtedy gdy zbyt wolny układ slave wymusi poziom niski lub podczas procedury arbitracyjnej.

Wróć do początku


Transfer - na poziomie bitów

Ze względu na możliwość podłączenia układów wykonanych w różnych technologiach (NMOS, CMOS, bipolarne), napięcia dla poziomów logicznych '0' i '1' nie są zdefiniowane i zależą od odpowiedniego poziomu napięcia zasilającego Vdd. Napięcia poniżej poziomu 0,3Vdd rozpoznawane są jako poziom niski, zaś napięcia powyżej poziomu 0,7Vdd - jako poziom wysoki (dla Vdd=5V: VLmax=1,5V VHmin=3V) Dla każdego przesyłanego bitu generowany jest jeden impuls zegarowy.

Dane na linii SDA muszą być stabilne podczas wysokiego poziomu sygnału zegarowego. Stan na linii danych może się zmieniać tylko podczas niskiego stanu sygnału zegarowego (na linii SCL).

Zmiana danych

Wróć do początku


START i STOP

Najważniejszymi sytuacjami podczas transmisji na szynie I2C są bity START i STOP.

Gdy na linii SDA stan logiczny zmienia się z '1' na '0', podczas gdy na linii SCL jest stan '1', to sytuacja taka nazywa się START. Natomiast gdy na linii SDA stan logiczny zmienia się z '0' na '1', podczas wysokiego poziomu na linii SCL, to sytuacja taka nazywa się STOP.

Bity Start i Stop

START i STOP generowane są zawsze przez układ master. Po wygenerowaniu START'u szyna jest zajęta, natomiast po wygenerowaniu STOP'u szyna jest wolna. Wykrywanie START'u i STOP'u jest łatwe, gdy podłączone urządzenia zawierają odpowiedni interfejs sprzętowy. Mikrokontrolery bez tego interfejsu, w celu wykrycia transmisji, muszą próbkować linię SDA co najmniej dwa razy w ciągu cyklu zegarowego.

Wróć do początku


Transfer danych

Informacje wysyłane na linię SDA muszą być 8-bitowe. Liczba bajtów, które mogą być przesłane nie jest limitowana. Każdy bajt musi zostać potwierdzony bitem potwierdzenia. Podczas transmisji danych pierwszy wysyłany jest bit najstarszy. Jeżeli odbiornik nie może odebrać następnego kompletnego bajtu danych, ze względu na konieczność wykonania jakichś innych funkcji, to może wymusić poziom '0' na linii SCL, w tym momencie nadajnik przejdzie w stan oczekiwania. Transmisja będzie kontynuowana, gdy odbiornik zwolni linię SCL.

Wróć do początku


Potwierdzenie

Transmisja z potwierdzeniem jest jedyną możliwą na szynie I2C. Impuls zegarowy dla bitu potwierdzenia jest generowany, tak jak zawsze, przez układ master. Na czas impulsu zegarowego dla bitu potwierdzenia nadajnik zwalnia linię SDA (poziom wysoki). Odbiornik musi wymusić niski poziom na linii SDA podczas tego impulsu zegarowego, tak aby poziom niski był stabilny podczas wysokiego poziomu na linii SCL.

Potwierdzenie

Zwykle zaadresowany odbiornik musi wygenerować bit potwierdzenia, po każdym odebranym bajcie (jest jeden wyjątek, dla zachowania kompatybilności z szyną CBUS). Gdy odbiornik-slave nie może potwierdzić swojego zaadresowania (na przykład nie może odbierać, ponieważ wykonuje jakieś funkcje w czasie rzeczywistym), to musi pozostawić linię SDA w stanie wysokim. Master może wtedy wygenerować STOP, aby przerwać transmisję.

Gdy odbiornik-slave potwierdzi swoje zaadresowanie, ale potem podczas transmisji nie będzie mógł odbierać kolejnych danych, to master znowu będzie musiał przerwać transmisję. Sytuacja tak jest rozpoznawana, gdy slave nie wygeneruje bitu potwierdzenia po pierwszym kolejnym bajcie (zostawi linię SDA w stanie wysokim). Master wygeneruje wtedy sygnał STOP.

Gdy odbiornikiem jest układ master, to sygnalizuje on koniec danych nadajnikowi-slave nie generując bitu potwierdzenia po ostatnim bajcie wysłanym przez układ slave. Nadajnik-slave musi wtedy zwolnić linię danych, aby umożliwić układowi master wygenerowanie sygnału STOP.

Wróć do początku


Arbitraż i synchronizacja

Synchronizacja

Każdy master generuje własny sygnał zegarowy na linii SCL, gdy chce przesłać dane szyną I2C. Dane ważne są tylko podczas wysokiego poziomu na linii SCL. Synchronizacja zegarów następuje przy pomocy połączenia galwaniczne-AND wszystkich układów do linii SCL. Zsynchronizowany sygnał zegarowy generowany jest z poziomem niskim określonym przez układ, który najdłużej utrzymał poziom '0' i z poziomem wysokim określonym przez układ, który najkrócej utrzymał poziom '1'.

Arbitraż

Układ master może zacząć transmisję tylko wtedy gdy szyna jest wolna. Może się jednak zdarzyć, że dwa lub więcej układy master wygenerują sygnał START w tym samym czasie. Rozpocznie się wtedy procedura arbitracyjna. Arbitraż ma miejsce podczas wysokiego poziomu na linii SCL. W takim przypadku master, który nadaje poziom wysoki na linii SDA, podczas gdy drugi master nadaje poziom niski, przestanie nadawać, ponieważ stan na linii SDA nie będzie odpowiadał stanowi przez niego wygenerowanemu. Arbitraż może trwać przez wiele bitów. Jego pierwszym etapem jest porównywanie bitów adresowych. Jeżeli układy master starają się zaadresować te samo urządzenie, arbitraż przeciąga się na bity danych. Ponieważ adres i dane używane są do arbitracji, żadna informacja nie jest tracona podczas tego procesu. Master, który stracił arbitraż może generować sygnał zegarowy do końca bajtu, w którym stracił arbitraż.

Jeśli master pełni również funkcję slave i stracił arbitraż podczas etapu adresowania to jest możliwe, że wygrywający master próbuje go zaadresować. Master, który przegrał arbitraż musi czym prędzej przełączyć się w tryb slave.

Procedura arbitracyjna dwóch układów master pokazana jest na rysunku.

Oczywiście w arbitrażu może uczestniczyć więcej układów master (zależy ile jest podłączonych).

Kontrola szyny I2C zależy od wysłanego, przez konkurujące układy master, adresu i danych, tak więc zbędny jest jakikolwiek master centralny lub kolejność priorytetów.

Arbitraż nie może mieć miejsca między:

- powtórzonym sygnałem START i bitem danych,

- sygnałem STOP i bitem danych,

- powtórzonym sygnałem START i sygnałem STOP.

Wróć do początku


Adresowanie 7-bitowe

Po bicie START wysyłany jest 7-bitowy adres, uzupełniony ósmym bitem R/W określającym kierunek transmisji - '0' oznacza zapis, '1' oznacza odczyt. Transmisja danych zawsze kończy się bitem STOP generowanym przez układ master. Jeżeli master nadal chce komunikować się po szynie, to może wygenerować powtórzony sygnał START i zaadresować następny układ slave bez generowania bitu STOP.

Możliwe są więc następujące formaty wysyłanych danych:

ˇ Nadajnik-master nadaje do odbiornika-slave. Kierunek transmisji jest niezmienny.

ˇ Master czyta dane od slave natychmiast po pierwszym bajcie. Po pierwszym potwierdzeniu nadajnik-master staje się odbiornikiem-master, a odbiornik-slave staje się nadajnikiem-slave. Potwierdzenie to generowane jest jeszcze przez układ slave. Bit STOP generowany jest przez układ master.

ˇ Format mieszany. Podczas zmiany kierunku nadawania, powtarzany jest bit START i adres układu slave, ale ze zmienionym bitem R/W.

Uwagi.

1. Format mieszany może być używany np. do sterowania pamięcią szeregową. Pierwszy bajt danych określa wewnętrzny adres w pamięci. Po powtórzonym bicie START i adresie układu mogą być przesłane dane.

2. To czy adres wewnątrz pamięci będzie automatycznie zwiększany, czy zmniejszany zależy od projektanta danego układu.

3. Po każdym bajcie następuje bit potwierdzenia

Wróć do początku


Rozszerzenia specyfikacji szyny I2C

Szyna I2C z szybkością przesyłu 100kb/s i adresowaniem 7-bitowym istnieje już od około 15 lat. Kilka lat temu wprowadzono do niej pewne unowocześnienia:

ˇ tryb szybki (ang. Fast-mode) - z prędkością przesyłu do 400kb/s

ˇ adresowanie 10-bitowe - pozwalające zaadresować do 1024 urządzeń.

Wróć do początku

Powrót do strony głównej


Opracował: Piotr Głaska

Na podstawie:
Philips: "80C51-Based 8-Bit Microcontrollers - DATA HANDBOOK IC20"
Philips: "Semiconductors For Televison And Video Systems - DATA HANDBOOK"



Ostatnia aktualizacja: 22 pazdziernik 1996